package org.az.netty_study.p02_nio组件之channel;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;

/**
 * 一个channel向另一个channel写入内容，这种方法效率比传统io传输数据快，因为底层是基于零拷贝
 */
public class _2_FileChannel传输数据 {
    public static void main(String[] args) throws Exception {
        //准备好两个channel，一个读，一个写
        FileChannel from = new FileInputStream("src\\main\\resources\\from.txt").getChannel();
        FileChannel to = new FileOutputStream("src\\main\\resources\\to.txt").getChannel();
        /**
         * 调用传输方法，三个参数:从from文件的哪个位置开始传输,传输的数据量，传到哪个channel
         * transferTo方法返回值:实际传输字节数
         * transferTo方法一次最多传输2G的数据，超过2G需要循环传输
         */
        long totalSize = from.size();
        //left表示剩余多少个字节没传完
        for (long left = totalSize; left > 0; ) {
            //size为此次传了多少个字节，totalSize - left表示此次从from文件的哪个位置开始传
            long size = from.transferTo((totalSize - left), from.size(), to);
            //(totalSize - size)表示剩余多少个字节没传完
            left -= size;
        }

    }
}
